home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 2 / Deutsche Edition 2.iso / mac / POWERMAC / C64 / SOURCE / HardDrive.c < prev    next >
Text File  |  1994-06-06  |  3KB  |  135 lines

  1. /*
  2.     Commodore 64 Emulator v0.4      Earle F. Philhower III 
  3.     Copyright (C) 1993-4            (st916w9r@dunx1.ocs.drexel.edu)
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. #include "Processor.h"
  21. #include "Serial.h"
  22. #include "HardDrive.h"
  23. #include "Error.h"
  24.  
  25. int PetConv(int c);
  26. void PetConvString(Str32 c);
  27. static byte ReadMac(unsigned char *data, int secondary);
  28. static byte WriteMac(unsigned char data, int secondary);
  29. static byte OpenMac(char *name, int length, int secondary);
  30. static byte CloseMac(int secondary);
  31. static byte PutByte(byte data, int secondary);
  32. static byte GetByte(byte *data, int secondary);
  33.  
  34. enum { NOTINUSE=0, WRITE, READ };
  35.  
  36. typedef struct
  37. {
  38.     short fNum;
  39.     byte mode;
  40. } FSInfo;
  41.  
  42. static FSInfo fsInfo[2];
  43. static short dirID=0;
  44.  
  45. static byte PutByte(byte data, int secondary)
  46. {
  47.     long len;
  48.     
  49.     len=1; FSWrite(fsInfo[secondary].fNum, &len, &data);
  50.     if (len==0) return kSerialError;
  51.     else return kSerialOK;
  52. }
  53.  
  54. static byte GetByte(byte *data, int secondary)
  55. {
  56.     long len;
  57.     
  58.     len=1; FSRead(fsInfo[secondary].fNum, &len, data);
  59.     if (len==0) return kSerialEOF;
  60.     else return kSerialOK;
  61. }
  62.     
  63. int HardInitialize(void)
  64. {
  65.     fsInfo[0].mode=fsInfo[1].mode=NOTINUSE;
  66.  
  67.     AddSerialDevice(9, ReadMac, WriteMac, OpenMac, CloseMac, NULL);
  68.     
  69.     return kNoError;
  70. }
  71.  
  72. int PetConv(int c)
  73. {
  74.     switch (c&0xe0)
  75.     {
  76.         case 0x40:
  77.         case 0x60:
  78.             return (c^0x20);
  79.     }
  80.     return (c);
  81. }
  82.  
  83. void PetConvString(Str32 c)
  84. {
  85.     int i;
  86.     for (i=1; i<c[0]+1; i++) c[i]=PetConv(c[i]);
  87. }
  88.  
  89. static byte WriteMac(unsigned char data, int secondary)
  90. {
  91.     if (fsInfo[secondary].mode!=WRITE) return kFloppyError;
  92.     return PutByte(data, secondary);
  93. }
  94.  
  95. static byte ReadMac(unsigned char *data, int secondary)
  96. {
  97.     if (fsInfo[secondary].mode!=READ) return kFloppyError;
  98.     return GetByte(data, secondary);
  99. }
  100.  
  101. static byte OpenMac(char *name, int length, int secondary)
  102. {
  103.     Str32 tmp;
  104.     if (fsInfo[secondary].mode!=NOTINUSE) return kFloppyError;
  105.     if ((secondary<0)||(secondary>=2)) return kFloppyError;    
  106.  
  107.     BlockMove(name, tmp+1, length);
  108.     tmp[0]=length;
  109.     PetConvString(tmp);
  110.  
  111.     if ((fsInfo[secondary].mode=(secondary==1?WRITE:READ))==WRITE)
  112.         Create(tmp, dirID, 'C64E', 'TEXT');
  113.     if (FSOpen(tmp, dirID, &(fsInfo[secondary].fNum))!=noErr)
  114.         return kFloppyError;
  115.     return kSerialOK;
  116. }
  117.  
  118. static byte CloseMac(int secondary)
  119. {
  120.     switch(fsInfo[secondary].mode)
  121.     {
  122.         case WRITE:
  123.         case READ:
  124.             FSClose(fsInfo[secondary].fNum);
  125.             fsInfo[secondary].mode=NOTINUSE;
  126.             return kSerialOK;
  127.         default:
  128.             return kSerialError;
  129.     }
  130. }
  131.  
  132. void HardChangeDirectory(void)
  133. {
  134. }
  135.